import { defineStore } from 'pinia'
import { getToken, removeToken, setToken } from '../utils/token-utils'
import type { UserInfoState } from './interface'
import { ElMessage } from 'element-plus'
import { staticRoutes, asyncRouters, anyRoutes } from '@/router/routes'
// 导入参数类型
import type { Request } from '@/api/user'
import { loginOnce, info, logout } from '@/api/user'
import type { RouteRecordRaw } from 'vue-router'
// 导入 routes
import router from '@/router'
import { cloneDeep } from 'lodash'

// 定义方法,过滤出用户信息的菜单权限
const filterRouters = (asyncRouters: Array<RouteRecordRaw>, routesName: string[]) => {
  // 过滤
  let async1 = asyncRouters.filter((item) => {
    // item为每个路由

    // 动态路由中可能还会存在子集路由 所以还需要判断
    // 判断当前每个路由中的children是否有值,且还需要有长度
    // 因为可能存在 children 的值是一个空数组
    if (item.children && item.children.length) {
      // 递归遍历
      item.children = filterRouters(item.children, routesName)
    }
    // 查看 用户信息返回的菜单权限中是否存在每一条路由的name
    let isExidet = routesName.includes(item.name as string)

    return isExidet
  })
  return async1
}

// 定义方法,新增路由
const addRoutes = (allRoutes: Array<RouteRecordRaw>) => {
  allRoutes.forEach((route) => {
    // 使用 vue-router提供的addRoute方法
    router.addRoute(route)
  })
}

// 个人信息 的接口规范
export interface userInfoModole {
  avatar: string
  buttons: string[]
  name: string
  roles: string[]
  routes: string[]
}

// 初始化 个人信息结构
const infoUser = () => ({
  avatar: '',
  buttons: [],
  name: '',
  roles: [],
  routes: []
})
/**
 * 用户信息
 * @methods setUserInfos 设置用户信息
 */
export const useUserInfoStore = defineStore('userInfo', {
  state: (): UserInfoState => ({
    token: getToken() as string,
    name: '',
    avatar: '',
    user: infoUser(),
    menuRoutes: []
  }),

  actions: {
    async login(userInfo: Request) {
      // return new Promise((resolve, reject) => {
      //   setTimeout(() => {
      //     if (username==='admin' && password==='111111') {
      //       const token = 'token-atguigu'
      //       setToken(token)
      //       this.token = token
      //       resolve(token)
      //     } else {
      //       reject(new Error('用户名或密码错误!'))
      //       ElMessage.error('用户名或密码错误!')
      //     }
      //   }, 1000)
      // })
      // const res = await service.post(
      //   '/admin/acl/index/login',
      //   // 使用 json格式发送请求
      //   {
      //     username: username,
      //     password: password
      //   }
      // )
      // return new Promise((resolve, reject) => {
      //   console.log(res) // 测试
      //   // 判断返回的 code 码
      //   if (res.code === 20000) {
      //     // 存储token
      //     setToken(res.data)
      //     // 设置token
      //     this.token = res.data
      //     resolve(res.data)
      //   }
      // })
      try {
        const res = await loginOnce(userInfo)
        // console.log(res.data)
        if (res.code === 20000) {
          setToken(res.data.token)
          this.token = res.data.token
          // return 'ok'
        }
      } catch (error) {
        // 抛出错误并提示
        ElMessage.error('登录失败,请尝试重新登录')
        // 将错误继续向下抛出
        return Promise.reject(error)
      }

      // 调用登录请求 api

      // return new Promise((resolve, reject) => {
      //   console.log(res) // 测试
      //   // 判断返回的 code 码
      //   if (res.code === 20000) {
      //     // 存储token
      //     setToken(res.data)
      //     // 设置token
      //     this.token = res.data
      //     resolve(res.data)
      //   }
      // })
    },

    async getInfo() {
      // return new Promise((resolve, reject) => {
      //   setTimeout(() => {
      //     this.name = 'admin'
      //     this.avatar = 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif'
      //     this.menuRoutes = staticRoutes
      //     resolve({ name: this.name, avatar: this.avatar, token: this.token })
      //   }, 1000)
      // })

      try {
        const res = await info()
        // console.log(res)
        // 判断业务状态码是否时 20000
        // 将获取到的数据存储起来
        if (res.code === 20000) {
          this.user = res.data
          console.log(res)

          // routes
          // 过滤登录返回的个人用户信息的菜单全选
          let filterRoutes = filterRouters(cloneDeep(asyncRouters), res.data.routes)
          // 做一个拼接
          let allRoutes = staticRoutes.concat(filterRoutes, anyRoutes)
          // this.menuRoutes = staticRoutes.concat(filterRoutes, allRoutes)
          this.menuRoutes = allRoutes

          // 动态新增路由
          addRoutes(allRoutes)
        }
      } catch (error) {
        return Promise.reject(error)
      }
    },

    async reset() {
      try {
        // 发送请求
        await logout()
        // 删除local中保存的token
        removeToken()
        // 提交重置用户信息的mutation
        this.token = ''
        // 重置基础用户信息结构
        this.user = infoUser()
      } catch (error) {
        ElMessage.error('退出登录失败,请重试')
        // 继续往下抛出错误
        return Promise.reject(error)
      }
    }
  }
})
